import type { PluginListenerHandle } from '@capacitor/core';

export interface Result {
   /**
    * 表示操作是否成功
    */
   isSuccess: boolean;
   /**
    * 插件返回给前端的提示信息，主要用于快速识别异常的原因，面向开发人员的信息
    */
   message: string;
}
export interface connectResult extends Result {
   /**
    * 是否成功，注意这个是有执法仪返回，和isSuccess性质不一样
    */
   ret: boolean;

   /**
    * 由执法仪返回的信息
    */
   value: string;
}

export interface FTPListFileResult extends Result {
   /**
    * 文件的列表
    */
   data: FTPFileModule[];
}

export interface FTPRetrieveFile extends Result {
   /**
    * 文件下载保存到本地的路径
    */
   localFilePath: string;
}


export interface FTPParameters {
   /**
   * 设备编号
   */
   DevId: string;
   /**
   * http端口
   */
   FtpHttpPort: number;
   /**
   * FTP的ip
   */
   FtpIp: string;
   /**
   * FTP端口
   */
   FtpPort: number;
   /**
   * 密码
   */
   FtpPwd: string
   /**
   * 用户名
   */
   FtpUser: string
   /**
   * 指示灯
   */
   IndicatorLight: number
   /**
   * 自动红外
   */
   InfraredAuto: number
   /**
    * 定位回传频率
    */
   LocationFreq: number
   /**
    * 图传设置（中文）
    */
   NetTransBit: string
   /**
    * 图传设置（编码）
    */
   NetTransRes: number
   /**
    * 设备（回放）密码设置
    */
   PlaybackPwd: string
   /**
    * 延录
    */
   PostRec: PostRecEnum
   /**
    * 预录
    */
   PreRec: 0 | 1
   /**
    * 服务器IP
    */
   ServerIP: string
   /**
    * 服务器端口号
    */
   ServerPort: number
   /**
    * 拍照分辨率
    */
   SnapRes: number
   /**
    * 连拍张数
    */
   SnapShot: SnapShotEnum
   /**
    * 定时拍照
    */
   SnapShotTime: SnapShotTimeEnum
   /**
    * 用户号
    */
   User: string
   /**
    * 视频质量
    */
   VideoQuality: VideoQualityEnum
   /**
    * 视频分辨率
    */
   VideoRes: VideoResEnum
   /**
    * 视频分段
    */
   VidPtime: VidPtimeEnum
   /**
   * 未知
   */
   Fbutton: number
   /**
    * 未知
    */
   Type: string
}
export interface FTPFileModule {
   /**
    * 文件在执法仪上的名字
    */
   FileName: string;

   /**
    * 文件的大小
    */
   FileSize: number;

   /**
   * 文件的时间
   */
   Times: string;

   /**
   * 文件执法仪上的FTP地址，下载文件需要根据这个地址找到文件下载
   */
   FtpFilePath: string;
}

export interface jwtPluginPlugin {
   /**
    * 连接设备的接口，返回值是异步，需要根据设备响应后信息再返回
    * @param options 无实际作用，作保留用
    * @returns connectResult
    */
   connect(options?: { params: string }): Promise<connectResult>;

   /**
     * 调用设备拍照功能，拍照后照片保存在设备。返回值同样是异
     * @param options 无实际作用，作保留用
     * @returns 
     */
   snap(options?: { params: string }): Promise<connectResult>;

   /**
     * 调用设备录像功能，返回值同样是异步
     * @param options starting: true表示开始录像，false表示停止录像
     * @returns message中会识别是录像开始还是停止，但是只要响应了isSuccess就是true
     */
   record(options: { starting: boolean }): Promise<connectResult>;

   /**
     * 断开设备连接
     * @param options 无实际作用，作保留用
     * @returns 无
     */
   stopConnecting(options?: { params: string }): Promise<void>;

   /**
     * 设置参数到设备
     * 设备在连接的时候会返回初始化的参数，通过onParamsListener监听事件接口回调到前端，参数的字段是zfyParameters
     * @param options params: 设置参数信息，json格式
     * @returns 无
     */
   setParameters(options: {
      params: Partial<FTPParameters>
   }): Promise<void>;

   /**
     * 打开FTP连接，一般来说原生在获取设备参数后会自动调用这个方法连接上设备的FTP
     * 账号密码和端口都是通过初始化的设备参数获取。同时开放此方法给前端自由调用
     * @param options 无实际作用，作保留用
     * @returns 返回连接是否成功的信息，isSuccess=true的时候成功
     */
   ftpConnect(options?: { params: string }): Promise<Result>;

   /**
     * 获取设备上的文件，目前可查询图片和视频
     * @param options type: PICTURE是图片类型，VIDEO是视频类型。注意枚举对应的值不要修改，用于查询
     * @returns 查询的结果对象列表，FileName 文件名 ，FileSize 文件大小，Times 文件的时间，FtpFilePath 文件在设备上被ftp查询到的地址
     */
   ftpListFiles(options: { type: FTPFileEnum }): Promise<FTPListFileResult>;

   /**
      * 下载执法仪的文件到本机
      * @param options fileName: 保存到本地的文件名，注意这个文件名是可以自定义的，最后以前端命名的文件名保存；ftpFilePath: 需要下载的文件的FTP地址，由查询时候返回的FtpFilePath字段带出给前端。
      * @returns localFilePath文件下载到本地的地址
      */
   ftpRetrieveFile(options: { fileName: string, ftpFilePath: string }): Promise<FTPRetrieveFile>;

   /**
      * 播放RTSP视频流，注意要连接设备后才能获取RTSP的地址（由原生获取，前端保证在连接后调用即可）
      * @param options 无实际作用，作保留用
      * @returns 失败返回原因，成功不返回
      */
   playRTSP(options?: { params: string }): Promise<void>;

   /**
      * 停止播放RTSP，并释放资源，建议在应用退到后台、离开界面的时候释放资源
      * @param options 无实际作用，作保留用
      * @returns 
      */
   stopRTSP(options?: { params: string }): Promise<void>;

   /**
   * 监听事件名称：onParamsListener，接口将设备参数信息回调给前端，参数的字段是data.zfyParameters
   * @param eventName 监听事件的名称
   * @param listenerFunc zfyParameters: 接口回调的参数信息，json格式
   * @returns 
   */
   addListener(eventName: 'onParamsListener', listenerFunc: (data: {
      zfyParameters: Partial<FTPParameters>
   }) => void): Promise<PluginListenerHandle> & PluginListenerHandle;

   /**
   * 监听事件名称：onVideoDismiss，关闭视频流弹窗时，接口通知前端
   * @param eventName 监听事件的名称
   * @param listenerFunc 回调方法
   * @returns 
   */
   addListener(eventName: | 'onVideoDismiss', listenerFunc: () => void): Promise<PluginListenerHandle> & PluginListenerHandle;
}


export enum FTPFileEnum {
   /**
   * 图片类型
   */
   PICTURE = "/PICTURE",
   /**
   * 视频类型
   */
   VIDEO = "/MP4"
}

export enum VideoResEnum {
   "1080P 1920*1080" = 0,
   "720P 1280*720" = 1,
   "480P 720*480" = 2,
   "2K" = 3
}

export enum VideoQualityEnum {
   '高' = 0,
   '中' = 1,
   '低' = 2
}

export enum VidPtimeEnum {
   '自动' = 0,
   '1分钟' = 1,
   '3分钟' = 2,
   '5分钟' = 3,
   '10分钟' = 4,
   '20分钟' = 5,
   '30分钟' = 6
}

export enum SnapShotEnum {
   '1张' = 0,
   '3张' = 1,
   '5张' = 2,
   '10张' = 3,
   '20张' = 4,
   '30张' = 5,
}

export enum SnapShotTimeEnum {
   '关闭' = 0,
   '30秒' = 1,
   '1分钟' = 2,
   '2分钟' = 3,
   '4分钟' = 4,
   '5分钟' = 5,
}

export enum PostRecEnum {
   '关闭' = 0,
   '10秒' = 1,
   '30秒' = 2,
   '1分钟' = 3,
   '2分钟' = 4,
   '5分钟' = 5,
   '10分钟' = 6,
   '30分钟' = 7,
}